package com.interview.javabasic.DataStructrue;/*
@李子宁
Happy,happy everyday!
冲鸭！
*/

public class DoubleLinkedListDemo {
    public static void main(String[] args) {

    }
}

//创建一个双向链表类
class DoubleLinkedList{
    private HeroNode2 head = new HeroNode2(0,"","");
    public HeroNode2 getHead(){
        return head;
    }

    //遍历双向链表的方法
    public void list(){
        //判断链表为空
        if (head.next==null){
            return;
        }
        //因为头结点不能动
        HeroNode2 tmp = head.next;
        while (true){
            //判断是否遍历结束
            if (tmp==null){
                break;
            }
            System.out.println(tmp);
            //将tmp后移
            tmp = tmp.next;//不后移会是个死循环
        }
    }

    //添加，默认添加到双向链表的尾部
    public void add(HeroNode2 heroNode){
        //因为head节点不能动，所以我们需要一个辅助指针tmp
        HeroNode2 tmp = head;
        //遍历链表，找到最后
        while (true){
            //找到最后的节点
            if (tmp.next==null){
                break;
            }
            //如果没有找到最后的节点，就后移
            tmp = tmp.next;
        }
        //当退出while时，tmp就指向了链表的最后
        tmp.next = heroNode;
        //形成一个双向链表
        heroNode.pre = tmp;
    }

    //删除一个节点，对于双向链表可以直接找到这个节点，而不用找到前一个链表。
    public void delete(int no){
        HeroNode2 tmp = head.next;
        boolean flag = false;//是否找到待删除节点的前一个节点
        if (head.next==null){
            System.out.println("链表为空，无法删除~");

        }
        while(true){
            if (tmp == null){
                break;
            }
            if (tmp.no == no){
                flag = true;
                break;
            }
            tmp = tmp.next;
        }
        if (flag){
            tmp.pre.next = tmp.next;
            //这里的代码有问题，如果是最后一个节点就不执行这句话。
           if (tmp.next!=null){
               tmp.next.pre = tmp.pre;
           }
        }else{
            System.out.println("不存在这样的节点值%d");
        }
    }



}

class HeroNode2{
    public int no;
    public String name;
    public String nickname;
    public HeroNode2 next;
    public HeroNode2 pre;

    public HeroNode2(int hno,String hname,String nickName){
        this.no = hno;
        this.name = hname;
        this.nickname = nickName;
    }

    @Override
    public String toString() {
        return "HeroNode{" +
                "no=" + no +
                ", name='" + name + '\'' +
                ", nickname='" + nickname + '\''+
                '}';
    }
}